建造者模式

1. 概述

建造者模式,优势在于能够通过链式编程生成对象,且用户不需要关心建造的细节。

缺点:产生多余的Builder的内部类,内部修改困难,如果产品内部发生变化,建造者也需要做相应的修改。

2. 思路

  1. 创建一个静态内部类Builder作为建造者,此类与外部类拥有的属性相同。
  2. 在静态内部类中,必须传递的参数通过公开的构造器进行传参赋值,可选的参数则通过建造者的setter方法进行传参。
  3. 在静态内部类中,生成一个建造外部类的方法build来调用外部类的构造器获取实例。
  4. 构造器私有化,且只保留一个通过建造者建造的构造器,同时完成二者的参数赋值。

使用:

通过调用此类的静态内部类生成实例。

Computer computer = new Computer.Builder("M1 ULTRA", "64GB")
    .buildMouse("妙控鼠标")
    .buildKeyboard("妙控键盘")
    .buildMonitor("Displays")
    .build();

3. 示例代码

import lombok.Data;
import lombok.ToString;

@Data
@ToString
public class Computer {
    private final String cpu;   // 必选
    private final String ram;   // 必选
    private final String mouse;
    private final String keyboard;
    private final String monitor;

    private Computer (Builder builder) {
        this.cpu = builder.cpu;
        this.ram = builder.ram;
        this.mouse = builder.mouse;
        this.keyboard = builder.keyboard;
        this.monitor = builder.monitor;
    }

    static class Builder {
        private String cpu;
        private String ram;
        private String mouse;
        private String keyboard;
        private String monitor;

        public Builder(String cpu, String ram) {
            this.cpu = cpu;
            this.ram = ram;
        }

        public Builder buildMouse(String mouse) {
            this.mouse = mouse;
            return this;
        }

        public Builder buildKeyboard(String keyboard) {
            this.keyboard = keyboard;
            return this;
        }

        public Builder buildMonitor(String monitor) {
            this.monitor = monitor;
            return this;
        }

        public Computer build() {
            return new Computer(this);
        }
    }

}

class Main {
    public static void main(String[] args) {
        Computer computer = new Computer.Builder("M1 ULTRA", "64GB")
            .buildMouse("妙控鼠标")
            .buildKeyboard("妙控键盘")
            .buildMonitor("Displays")
            .build();
        System.out.println(computer);   // Computer(cpu=M1 ULTRA, ram=64GB, mouse=妙控鼠标, keyboard=妙控键盘, monitor=Displays)
    }
}

4. 适用场景

  1. 对象有非常复杂的内部结构 , 有很多属性 ;
  2. 想把复杂对象的创建和使用分离 ;
  3. 当创造一个对象需要很多步骤时 , 适合使用建造者模式 ;
  4. 当创造一个对象只需要一个简单的方法就可以完成 , 适合使用工厂模式 ;
Copyright © rootwhois.cn 2021-2022 all right reserved,powered by GitbookFile Modify: 2023-03-05 10:55:52

results matching ""

    No results matching ""